/**
 * 文件名：@StorageReturnValueHandler.java <br/>
 * 包名：cn.efunbox.afw.web.mvc.springmvc <br/>
 * 项目名：afw-web <br/>
 * @author xtwin <br/>
 */
package cn.efunbox.afw.web.mvc.springmvc;

import javax.servlet.http.HttpServletRequest;

import org.springframework.core.MethodParameter;
import org.springframework.core.annotation.AnnotationUtils;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.support.HandlerMethodReturnValueHandler;
import org.springframework.web.method.support.ModelAndViewContainer;

import cn.efunbox.afw.core.annotation.Runaway;
import cn.efunbox.afw.web.mvc.view.ViewNameResolver;
import cn.efunbox.afw.web.util.AfwWebConstant;

/**
 * 类名：StorageReturnValueHandler  <br />
 * 
 * 功能：将返回值保存到上下文中，供后续统一处理
 *
 * @author xtwin <br />
 * 创建时间：2016年7月20日 下午5:50:47  <br />
 * @version 2016年7月20日
 */
public class StorageReturnValueHandler implements HandlerMethodReturnValueHandler {
	
	// 视图名称解析器
	protected ViewNameResolver viewNameResolver;

	/**
	 * 功能: <br/>
	 * 
	 * 重写：xtwin <br/>
	 * 
	 * @version ：2016年7月21日 上午7:56:19<br/>
	 * 
	 * @param returnType
	 * @return <br/>
	 * @see org.springframework.web.method.support.HandlerMethodReturnValueHandler#supportsReturnType(org.springframework.core.MethodParameter)
	 */
	@Override
	public boolean supportsReturnType(MethodParameter returnType) {
		return AnnotationUtils.findAnnotation(returnType.getMethod(), Runaway.class) == null
				&& AnnotationUtils.findAnnotation(returnType.getContainingClass(), Runaway.class) == null;
	}

	/**
	 * 功能: <br/>
	 * 
	 * 重写：xtwin <br/>
	 * 
	 * @version ：2016年7月20日 下午5:51:05<br/>
	 * 
	 * @param returnValue
	 * @param returnType
	 * @param mavContainer
	 * @param webRequest
	 * @throws Exception <br/>
	 * @see org.springframework.web.method.support.HandlerMethodReturnValueHandler#handleReturnValue(java.lang.Object, org.springframework.core.MethodParameter, org.springframework.web.method.support.ModelAndViewContainer, org.springframework.web.context.request.NativeWebRequest)
	 */
	@Override
	public void handleReturnValue(Object returnValue, MethodParameter returnType, ModelAndViewContainer mavContainer, NativeWebRequest webRequest) throws Exception {
		// 保存结果对象
		mavContainer.addAttribute(AfwWebConstant.KEY_RETURN_VALUE, returnValue);
		
		if (null == mavContainer.getView() && null != viewNameResolver) {
			// 解析视图，并保存到上下文中
			mavContainer.setViewName(viewNameResolver.resolve((HttpServletRequest) webRequest.getNativeRequest()));
		}
	}

	/**
	 * @version 2016年8月5日-上午12:58:17
	 */
	public void setViewNameResolver(ViewNameResolver viewNameResolver) {
		this.viewNameResolver = viewNameResolver;
	}
}